#!/usr/bin/env node

const http = require('http'),
      fs = require('fs'),
      qs = require('querystring'),
      log = console.log;

let items = loadItems();
//SIGINT按CTRL+C
process.on('SIGINT',()=>{
  saveItems();
})
//载入数据
function loadItems(){
  log('loadItems');
  try{
    let items = fs.readFileSync('./12-items.txt').toString('utf8');
    items = JSON.parse(items);
    return items;
  }catch(e){
    return [];
  }
}
//保存数据
function saveItems(){
  log('saveItems');
  //重启被干掉之后数据可以保存在文件里
  fs.writeFileSync('./12-items.txt',JSON.stringify(items));
}

let result = {
      status:200,
      reason:'ok',
     
};

http.createServer((req,res)=>{

    logRequest(req)
    if(req.url.slice(0,5)!=='/todo'){
      let html = fs.readFileSync('./12-todo.html').toString('utf8');
      
      if(req.url==='/'){
        res.end(html);
      }else if(req.url == '/12-todo.js'){
        fs.createReadStream('./12-todo.js').pipe(res);

      }else{
        res.end('not api request and not page request!');
      }

      return;
    }
    switch(req.method){
    case "GET":
      select(req,res);
      break;
    case "POST":
      insert(req,res);
      break;
    case "PUT":
      update(req,res)
      break;
    case "DELETE":
      remove(req,res);
      break;
    default:
       res.end(`${req.method} method not sport`);
  }
}).listen(8080);

//查询方法
function select(req,res){
  result.data = items;
  res.end(JSON.stringify(result));
}

//插入方法
function insert(req,res){
  let data = '';
  req.on('data',chunk=>data += chunk);
  req.on('end',()=>{
    let item = qs.parse(data).item;
    if(item!==''&&typeof item !=='undefined'){
      items.push(item);
      res.end(JSON.stringify(result));
    }else{
      result.status = 401;
      result.reason = 'item is empty';
      res.end(JSON.stringify(result));
    }
  });
   

}
//修改方法
function update(req,res){
  //get id
  let id = req.url.split(':')[1];
  //数据合法性校验
  //validate id
  //data type*
  //value min=0,max=items.length
  
  //get item
  let data = '';
  req.on('data',chunk =>data += chunk);
  req.on('end',()=>{
    //update items[id] = item
    let item = qs.parse(data).item;
    if(item !==''&& typeof item !== 'undefined'){
      items[id]==item;
      res.end(JSON.stringify(result));
    }else{
      result.status =401;
      result.reason = 'item is empty';
      res.end(JSON.stringify(result));
    }
  })
    //let item = items[id];
    res.end(req.method);

}

function remove(req,res){  
  //get id
 let id = req.url.split(':')[1];
  
  //id not exist del all
  if(typeof id === 'undefined'){
    items =[];
    result.status = 200;
    result.reason = 'delete all sucess'
    res.end(JSON.stringify(result));
    return;
  }
  //id exist
  items = items.splice(id,1);
  result.status=200;
  result.reason = 'del sucess';
  res.end(JSON.stringify(result));
  //valide id
  //id is ok del items[id]
   }

function logRequest(req){
    log(`${req.method} ${req.url} HTTP/${req.httpVersion}`);
      log(`${req.headers}`);

}


